package com.mes.schedule.manager.iface;

import java.util.List;
import java.util.Map;
import java.util.Set;

import com.mes.schedule.domain.ScheduleScheme;
/*import com.mes.schedule.persistence.domain.SPartTask;
import com.mes.schedule.persistence.domain.ScheduleScheme;*/
import com.mes.schedule.result.ScheduleResult;
import com.mes.schedule.sbt.TaskSink;

/**
 * 调度算法接口
 * @author lh
 *
 */
public interface IScheduleAlgorithm {
	/**
	 * 调度算法接口
	 * @param scheme
	 * @param mode
	 */
	public void schedule(ScheduleScheme scheme, int mode) ;
	
	/**
	 * 每次调度都自动处理,清除上次的分派结果
	 * 
	 * @param scheme
	 * @throws Exception
	 */
	public void clearScheduleResult(ScheduleScheme scheme) throws Exception;
	
	/**
	 * 深度克隆出一个新scheme,主要用于计算
	 * @param scheme
	 * @return
	 */
	public  ScheduleScheme cloneCalScheme(ScheduleScheme scheme);
	
	
	/**
	 * the main process of the schedule 
	 * @param scheme
	 * @param mode
	 * @throws Exception
	 */
	public List<ScheduleResult> doSchedule(ScheduleScheme scheme,int mode) throws Exception;

	/**
	 * 通过线程池执行调度
	 * @param scheme
	 * @param mode
	 * @return
	 * @throws Exception
	 */
	public List<ScheduleResult> doScheduleThreadPool(ScheduleScheme scheme,int mode) throws Exception;
	
	/**
	 *lqm todo
	 *以后应该将这个方法移出 
	 * @param scheme
	 */
	public void calPartTaskTime(ScheduleScheme scheme) ;
	
	
	
	/**
	 * 创建一个Map，里面记录工序与所有交货节点之间的关系
	 * @param scheme
	 * @return
	 */
	public Map<String, Set<TaskSink>> createTaskSink(ScheduleScheme scheme);


}
